[Amazon SNS] SMSのメッセージの送信者IDを指定してみた

[Amazon SNS] SMSのメッセージの送信者IDを指定してみた

Clock Icon2021.10.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部 IoT事業部の若槻です。

今回は、Amazon SNSで送信する SMS のメッセージの送信者 ID を指定してみました。

SMS の送信者IDは既定で"NOTICE"となる

AWS で SMS を送信できる機能である Amazon SNS ですが、送信した SMS の送信者 ID は既定でNOTICEとなります。

しかし、ビジネスでの利用においてはブランディングのためにこの送信者 ID は企業やサービスを表す ID としたい場合が多いと思います。また、SMS アプリ上でのメッセージの表示は送信者 ID ごとになるため、他企業と同じ画面にメッセージが表示されるのは避けたいですね。

送信者IDを指定してみる

そこで今回は、送信者 ID をclassmethodとして、以下の方法で SMS の送信を試してみます。

  • マネジメントコンソール
  • AWS CLI
  • Node.js(Lambda 関数)

マネジメントコンソールの場合

AWS マネジメントコンソールの場合は、[Mobile]-[テキストメッセージング(SMS)]-[テキストメッセージングの発行]で、[発信元 ID]-[送信者 ID]で指定することができます。

ちなみに記載の通り送信者 ID に指定できる値には下記の制限があります。

少なくとも 1 つの文字を含み、スペースを含まない、最大 11 文字の英数字またはハイフン (-)。先頭と末尾は英数字である必要があります。

メッセージを発行すると、送信者 ID がclassmethodとなったメッセージを受信できました。

AWS CLIの場合

AWS CLI のsns publish コマンドを使用します。

sns publishでの送信者 ID の指定は、message-attributesパラメータを使用します。

$ message="message from aws cli."
$ phoneNumber="+8180XXXXXXXX"
$ senderId="classmethod"
$ aws sns publish \
  --message ${message} \
  --phone-number ${phoneNumber} \
  --message-attributes \
    '{"AWS.SNS.SMS.SenderID":{"DataType":"String","StringValue":"'${senderId}'"}}'

送信者 ID がclassmethodとなったメッセージを受信できました。

制限に違反した値(英数字以外)を送信者 ID に指定した場合はParameterValueInvalidエラーとなりました。

$ senderId="クラスメソッド"
$ aws sns publish \
  --message ${message} \
  --phone-number ${phoneNumber} \
  --message-attributes \
    '{"AWS.SNS.SMS.SenderID":{"DataType":"String","StringValue":"'${senderId}'"}}'

An error occurred (ParameterValueInvalid) when calling the Publish operation: The senderID provided 'クラスメソッド' is not valid, it must be 1-11 alpha-numeric or hyphen (-) characters. It has to start and end with an alphanumeric character.

Node.js(Lambda関数)の場合

CDKコード

lib/aws-cdk-app-stack.ts
import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as lambdaNodejs from '@aws-cdk/aws-lambda-nodejs';
import * as iam from '@aws-cdk/aws-iam';

export class AwsCdkAppStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const sendSmsFunction = new lambdaNodejs.NodejsFunction(
      this,
      'sendSmsFunction',
      {
        functionName: 'send-sms-function',
        entry: './src/lambda/handlers/send-sms-handler.ts',
        handler: 'handler',
        runtime: lambda.Runtime.NODEJS_14_X,
      }
    );

    const snsTopicPolicy = new iam.PolicyStatement({
      actions: ['sns:Publish'],
      resources: ['*'],
    });

    sendSmsFunction.addToRolePolicy(snsTopicPolicy);
  }
}

Lambdaコード

AWS CLI の場合と同様ですが、送信者 ID の指定は、message-attributesパラメータを使用します。

src/lambda/handlers/send-sms-handler.ts
import * as AWS from 'aws-sdk';

const MESSAGE = 'message from AWS SDK for JavaScript on lambda';
const SENDER_ID = 'classmethod';

const sns = new AWS.SNS({ apiVersion: '2010-03-31' });

interface Event {
  phoneNumber: string;
}

export const handler = async (event: Event) => {
  const publischParams: AWS.SNS.PublishInput = {
    Message: MESSAGE,
    PhoneNumber: event.phoneNumber,
    MessageAttributes: {
      'AWS.SNS.SMS.SenderID': {
        DataType: 'String',
        StringValue: SENDER_ID,
      },
    },
  };
  await sns.publish(publischParams).promise();
};

動作

作成した Lambda 関数をイベントを指定して実行します。

{
  "phoneNumber": "+81XXXXXXXXXX"
}

送信者 ID がclassmethodとなったメッセージを受信できました。

まとめ

  • Amazon SNS で送信する SMS では送信者 ID を指定可能
  • 送信者 ID を指定することにより、メッセージの送信者の区別やブランディングを行うことができる
  • CLI や SDK での送信者 ID の指定はMessageAttributesを使って行う

参考

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.